package com.fyakm.daodejing;

import com.fyakm.daodejing.simple.*;

import java.util.Arrays;

public class TestMain2 {
    public static void main(String[] args) {
        // 创建大自然对象，用于管理物种进化过程
        Nature nature = new Nature();

        // 初始化环境因素，这里示例设置温度和食物可获取程度
        Environment environment = new Environment(25.0, 0.8);

        // 初始化一些物种并添加到物种池中
        int[] initialGenes1 = {20, 10, 5, 8, 3};
        Species species1 = new Species(initialGenes1);
        SpeciesPool.addSpecies(species1);

        int[] initialGenes2 = {22, 12, 6, 7, 4};
        Species species2 = new Species(initialGenes2);
        SpeciesPool.addSpecies(species2);

        // 设置进化控制参数，包括交叉率、变异率以及交叉点数
        double crossoverRate = 0.8;
        double mutationRate = 0.05;
        int crossoverPointsCount = 3;
        EvolutionController evolutionController = new EvolutionController(crossoverRate, mutationRate, crossoverPointsCount);

        // 模拟多轮进化，这里示例模拟100轮
        for (int generation = 0; generation < 100; generation++) {
            // 执行大自然进化过程，传入进化控制器和当前环境
            nature.evolve(evolutionController, environment);

            // 模拟物种间的相互作用，这里简单示例一个捕食关系，假设物种1捕食物种2
            if (nature.getSpeciesList().size() >= 2) {
                Interaction.simulatePredation(nature.getSpeciesList(), 0, 1);
            }

            // 输出每一轮进化后物种池中的物种数量及部分物种基因信息（方便观察进化情况）
            System.out.println("Generation: " + generation + ", Species Pool Size: " + SpeciesPool.getAllSpecies().size());
            if (!SpeciesPool.getAllSpecies().isEmpty()) {
                for (Species s : SpeciesPool.getAllSpecies()) {
                    System.out.println("Species Genes: " + Arrays.toString(s.getGenes()));
                }
            }
        }
    }
}